package Stream;


import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StreamTest1 {
    public static void main(String[] args) {
        /*
        练习一：添加一系列整数，并过滤奇数，只留下偶数
         */
//        单列集合默认使用ArrayList，双列集合默认使用HashMap
        ArrayList<Integer>list=new ArrayList<>();
        Collections.addAll(list,1,2,3,4,5,6,7,8,9,10);
//        System.out.println(list);
        list.stream().filter(s->(s%2==0)).forEach(s-> System.out.print(s+" "));
        /*
        练习二：
        创建一个ArrayList的集合，并添加一下字符串，字符串中前面是名字，后面是年龄
        "zhangsan,23","lisi,15","wangwu,26","zhapliu,19","sunqi,22"
        保留年龄大于等于24岁的人，并将结果收集到map集合中，姓名为键，年龄为值
         */
        System.out.println();
        System.out.println("--------------练习二------------------");
        ArrayList<String>list1=new ArrayList<>();
        Collections.addAll(list1, "zhangsan,23","lisi,15","wangwu,26","zhapliu,19","sunqi,25");
//       s.split(",")[1]此时，这个结果得到的是字符串，想要年龄，需要将其变为整数,可以调用Integer.paseInt方法
      /*  list1.stream().filter(s->Integer.parseInt(s.split(",")[1])>=24)
                .collect(Collectors.toMap(new Function<String, String>() {
                    @Override
                    public String apply(String s) {
//                        在这里获取键---->s.split(",")[0]
                        return s.split(",")[0];
                    }
                },
//                      参数一：流当中数据的类型，参数二：值的类型
                        new Function<String, Integer>() {
                            @Override
                            public Integer apply(String s) {
//                                在这里获取值。此时将 s.split(",")[1]  变为整数
                                return Integer.parseInt(s.split(",")[1]);
                            }
                        }
                ));*/
//          将上述所写的代码变为lambda表达式
        Map<String, Integer> collect = list1.stream()
                .filter(s -> Integer.parseInt(s.split(",")[1]) >= 24)
                .collect(Collectors.toMap(
                        s -> s.split(",")[0],
                        s -> Integer.parseInt(s.split(",")[1])
                ));
        System.out.println(collect);
        /*
        有两个ArrayList集合
        第一个集合：存储6名男演员的名字和年龄。第二个集合中：存储6名女演员的名字和年龄。
        姓名和年龄中间用逗号隔开。比如：张三，23
        需求:
        1.男演员只要名字为3个字的前两人
        2.女演员只要姓杨的，并且不要第一个
        3.把过滤后的男演员姓名和女演员姓名合并到一起
        4.将上一步的演员信息封装到actor对象中
        5.将所有演员对象都保存到List集合中
        男:    "蔡坤坤,24","叶齁咸,23","刘不甜,22","吴前,24","顾家,30","肖凉凉,27"
        女      "赵小英,35","杨莹,36","高圆圆,43","张甜甜,31","刘氏,35","杨小米,33"
         */
        System.out.println("====================练习三======================");
        ArrayList<String> manList=new ArrayList<>();
        ArrayList<String> womanList=new ArrayList<>();
        Collections.addAll(manList,"蔡坤坤,24","叶齁咸,23","刘不甜,22","吴前,24","顾家,30","肖凉凉,27");
        Collections.addAll(womanList, "赵小英,35","杨莹,36","高圆圆,43","张甜甜,31","刘氏,35","杨小米,33");

        //名字为三个字的男演员
        Stream<String> stream1=
        manList.stream().filter(s -> s.split(",")[0].length() == 3)
                .limit(2);
//                .forEach(s-> System.out.print(s+" "));
        System.out.println("");


        //名字为姓杨的女演员
        Stream<String> stream2 = womanList.stream().filter(s -> s.split(",")[0].startsWith("杨")).
                skip(1);
//        .forEach(s-> System.out.println(s));


//        过滤后的男演员姓名和女演员姓名合并到一起  concat方法
//        将上一步的演员信息封装到actor对象中
//        此时流中的数据都是String类型，需要转换成Actor对象(类型转换)
        Stream.concat(stream1,stream2)
                .map(new Function<String, Actor>() {
                    @Override
                    public Actor apply(String s) {
                        String name=s.split(",")[0];
                        int age=Integer.parseInt(s.split(",")[1]);
                        return new Actor(name,age);
                    }
                }).forEach(s-> System.out.println(s));


//          将所有演员对象都保存到List集合中
        List<Actor>list3=Stream.concat(stream1,stream2)
                .map(s->new Actor(s.split(",")[0],Integer.parseInt(s.split(",")[1])))
                .collect(Collectors.toList());
        System.out.println(list3);//所有符合条件的演员信息
    }
}
class Actor{
    private String name;
    private int age;

    public Actor() {
    }

    public Actor(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Actor{name = " + name + ", age = " + age + "}";
    }
}
